#include "Spell.h"
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

void spellInit(Spell * pSpell){

	pSpell->name = (char *)malloc(20*sizeof(char));
	pSpell->id = 0;
        pSpell->schooldamage = 0;
        pSpell->range = 0;
        pSpell->radius = 0;
        pSpell->cooldown = 0; 
        pSpell->curcooldown = 0;
        pSpell->manacost = 0;
        pSpell->needtarget = 0;
        pSpell->levelmin = 0;
        pSpell->basedamage = 0;

}

Spell * spellInitContinue(int * nb,int level){ /*renvoie un tableau de spell dans lequel se trouve tous les spell*/
                                            /*dont le level min est inferieur au level passé en parametre*/
	FILE * fSpell;
	Spell * pSpell;
	Spell * temp;

        int i,j,result;
	j = 0;
	*nb = 0;

	fSpell = fopen("data/Database/Spell.dat","r");
	if(fSpell == NULL)
	fSpell = fopen("../data/Database/Spell.dat","r");
	assert(fSpell!=NULL);

	fscanf(fSpell,"#nb =%d\n",nb);

	temp = (Spell *) malloc((*nb)*sizeof(Spell));
	pSpell = (Spell *) malloc((*nb)*sizeof(Spell));
	fscanf(fSpell,"id name schooldamage range radius cooldown manacost needtarget levelmin basedamage\n");


	for(i = 0;i<(*nb);i++){

	spellInit(&(temp[i]));

	result = fscanf(fSpell,"%d %s %d %d %d %d %d %d %d %d\n",&(temp[i].id),temp[i].name,
        	(int *)&(temp[i].schooldamage),&(temp[i].range),&(temp[i].radius),&(temp[i].cooldown),
        		&(temp[i].manacost),&(temp[i].needtarget),&(temp[i].levelmin),&(temp[i].basedamage));
	assert(result == 10);

	temp[i].curcooldown = 0;

	if(level>=temp[i].levelmin){ 

	pSpell[j] = temp[i];
	j++;
	}else{
	free(temp[i].name);
	}

	}

	*nb = j;
	free(temp);
	fclose(fSpell);
return pSpell;

}


void spellFree(Spell * tabSpell,int nb){


	int i;

	for(i = 0;i<nb;i++){
		free((tabSpell+i)->name);
		(tabSpell+i)->name = NULL;
	}

        free(tabSpell);
}

int spellGetCooldown(const Spell * pSpell){
    return pSpell->cooldown;
}
float spellGetCurcooldown(const Spell * pSpell){
    return pSpell->curcooldown;
}
int spellGetSchooldamage(const Spell * pSpell){
    return pSpell->schooldamage;
}
int spellGetManacost(const Spell * pSpell){
    return pSpell->manacost;
}
int spellGetRange(const Spell * pSpell){
    return pSpell->range;
}
int spellGetRadius(const Spell * pSpell){
    return pSpell->radius;
}
int spellGetNeedtarget(const Spell * pSpell){
    return pSpell->needtarget;

}

int spellGetBasedamage(const Spell * pSpell){
return pSpell->basedamage;
}

void spellSetCooldown(Spell * pSpell){

    pSpell->curcooldown=pSpell->cooldown;
}

void spellRefresh(Spell * tabSpell,int num,float interval){

 int i;
    for(i=0;i<num;i++){

	if(tabSpell[i].curcooldown > 0){
		tabSpell[i].curcooldown -= interval;
	}else{
		tabSpell[i].curcooldown = 0;
	}



    }

}
int spellGetId(const Spell * pSpell){
return pSpell->id;
}

void spellTestRegression(){
	Spell * tabSpells;
	int nb_spells;
	float temp;
	tabSpells = spellInitContinue(&nb_spells,10);
	printf("****** TEST SPELL START ************ \n");
	spellSetCooldown(tabSpells+1);
	temp = spellGetCurcooldown(tabSpells+1);
	spellRefresh(tabSpells,nb_spells,0.5);
	spellSetCooldown(tabSpells+1);
	if(temp == spellGetCurcooldown(tabSpells+1)){
		printf("Module travaille correctement.....\n");
	}else{
		printf("Attention erreur du module......\n");
	}
	printf("****** TEST SPELL END ************** \n");
	spellFree(tabSpells,nb_spells);

}
